home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / demos / spaceballscrktro / includes / startupocs.i < prev   
Encoding:
Text File  |  1980-01-04  |  6.0 KB  |  319 lines

  1.  
  2.  
  3. CACHEOFF    Equ    0                    ;1 = Disable caches
  4. NTSCEXIT    Equ    0                    ;1 = Exit if no PAL
  5. CHIPSETEXIT    Equ    0                    ;1 = Exit if <ECS, or 2 = Exit if <AGA
  6.  
  7.  
  8.     Bsr    TakeSystem
  9.     Bsr    Main
  10.     Bsr    FreeSystem
  11.     MoveQ    #0,d0
  12.     Rts
  13.     
  14.  
  15. ;======================================================================================================
  16.  
  17.  
  18. TakeSystem
  19.     Move.l    4.w,a6
  20.     Lea    gfxLib(PC),a1
  21.     Jsr    -$198(a6)                    ;OldOpenLibrary()
  22.     Lea    gfxBase(PC),a5
  23.     Move.l    d0,(a5)
  24.     Bne.s    .gfxLibOK
  25.     Moveq    #-1,d0                        ;Error, no graphics.library
  26.     Rts
  27. .gfxLibOK
  28.     Move.l    d0,a1
  29.     Cmp.w    #36,$14(a6)                    ;Check for Kickstart 2
  30.     Blo.s    .oldKS
  31.     BTst    #2,$cf(a1)                    ;Proper NTSC check
  32.     Bne.s    .PAL
  33.     Bra.s    .NTSC
  34. .oldKS    Cmp.w    #50+50<<8,$212(a6)                ;Alternative NTSC check
  35.     Beq.s    .pal
  36. .NTSC
  37.     IFNE    NTSCEXIT
  38.     Jsr    -$19e(a6)                    ;CloseLibrary()
  39.     MoveQ    #-3,d0                        ;Error, no PAL display found
  40.     Rts
  41.     ELSE
  42.     Lea    displayFlag(PC),a0
  43.     St    (a0)
  44.     ENDC
  45. .PAL    MoveQ    #1,d1
  46.     Move.l    #$400,d0
  47.     Jsr    -$c6(a6)                    ;AllocMem()
  48.     Lea    zeroPagePtr(PC),a0
  49.     Move.l    d0,(a0)
  50.     Bne.s    .zeroPageOK
  51.     Move.l    (a5),a1
  52.     Jsr    -$19e(a6)                    ;CloseLibrary()
  53.     MoveQ    #-2,d0                        ;Error, could not allocate memory
  54.     Rts
  55. .zeroPageOK
  56.     Lea    $dff000,a4
  57.     IFNE    CHIPSETEXIT-2
  58.     Lea    chipSetFlag(PC),a0
  59.     Clr.b    (a0)
  60.     ENDC
  61.     Move.w    $7c(a4),d0                    ;AGA check
  62.     Cmp.b    #$f8,d0
  63.     IFEQ    CHIPSETEXIT-2
  64.     Beq.s    .chipSetOK
  65.     ELSE
  66.     Bne.s    .notAGA
  67.     AddQ.b    #2,(a0)
  68.     Bra.s    .chipSetOK
  69. .notAGA
  70.     Cmp.b    #$fc,d0                        ;ECS check
  71.     Bne.s    .noReqChip
  72.     AddQ.b    #1,(a0)
  73.     IFNE    CHIPSETEXIT
  74.     Bra.s    .chipSetOK
  75.     ENDC
  76. .noReqChip
  77.     ENDC
  78.     IFNE    CHIPSETEXIT
  79.     Move.l    (a5),a1
  80.     Jsr    -$19e(a6)                    ;CloseLibrary()
  81.     Move.l    zeroPagePtr(PC),a1
  82.     Move.l    #$400,d0
  83.     Jsr    -$d2(a6)                    ;FreeMem()
  84.     MoveQ    #-4,d0                        ;Error, required chipset not found
  85.     Rts
  86.     ENDC
  87. .chipSetOK
  88.     Jsr    -$84(a6)                    ;Forbid()
  89.     Move.l    (a5),a6
  90.     IFEQ    CHIPSETEXIT
  91.     Tst.b    (a0)
  92.     Beq.s    .noViewFix
  93.     ENDC
  94.     Lea    oldView(PC),a0
  95.     Move.l    $22(a6),(a0)                    ;Save old view
  96.     Sub.l    a1,a1
  97.     MoveQ    #$7f,d0
  98.     Bsr    WaitBeam
  99.     Jsr    -$de(a6)                    ;LoadView()
  100.     Jsr    -$10e(a6)                    ;WaitTOF()
  101.     Jsr    -$10e(a6)                    ;Twice
  102. .noViewFix
  103.     Jsr    -$1c8(a6)                    ;OwnBlitter()
  104.     Jsr    -$e4(a6)                    ;WaitBlit()
  105.     IFNE    CACHEOFF
  106.     Bsr    DisableCache
  107.     ENDC
  108.  
  109.     Btst    #6,$1a(a4)                    ;Wait for disk DMA
  110.     Beq.s    .noDiskDMA
  111. .waitDiskDMA
  112.     Btst    #1,$1f(a4)
  113.     Beq.s    .waitDiskDMA
  114. .noDiskDMA
  115.     Lea    oldDMACON(PC),a0
  116.     Move.l    #$c0008000,d2
  117.     MoveQ    #$1f,d0
  118.     Bsr    WaitBeam
  119.     Move.w    $02(a4),(a0)+                    ;Save DMACON
  120.     Move.w    $10(a4),(a0)+                    ;Save ADKCON
  121.     Move.l    $1c(a4),(a0)                    ;Save INTENA and INTREQ
  122.     Move.l    #$7fff3fff,$9a(a4)                ;Kill INTENA and INTREQ
  123.     Move.w    #$7fff,$9e(a4)                    ;Kill ADKCON
  124.     Move.w    #$07ff,$96(a4)                    ;Kill DMACON
  125.     Or.l    d2,(a0)
  126.     Or.w    d2,-(a0)
  127.     Or.w    d2,-(a0)
  128.     And.w    #$87ff,(a0)
  129.     IFNE    CHIPSETEXIT-2
  130.     MoveQ    #2,d0
  131.     Cmp.b    chipSetFlag(PC),d0
  132.     Bne.s    .noAGASpr
  133.     ENDC
  134.     MoveQ    #0,d0
  135.     Move.w    d0,$106(a4)                    ;Reset AGA sprites to 140ns res.
  136.     Move.w    d0,$1fc(a4)
  137. .noAGASpr
  138.     Lea    $bfd100,a5                    ;Turn off drive(s)
  139.     Or.b    #$f8,(a5)
  140.     MoveQ    #0,d0
  141.     Bsr.s    .beamDelay
  142.     And.b    #$87,(a5)
  143.     MoveQ    #$60,d0
  144.     Bsr.s    .beamDelay
  145.     Or.b    #$f8,(a5)
  146.  
  147.     Bsr.s    getvbr
  148.     Lea    VBRReg(PC),a0
  149.     Move.l    d2,(a0)
  150.     Move.l    d2,a0
  151.     Move.l    zeroPagePtr(PC),a1
  152.     Move.w    #$400/4-1,d7
  153. .clp:    Move.l    (a0)+,(a1)+                    ;Save zero page
  154.     Dbf    d7,.clp
  155.  
  156.     Lea    2(a4),a6
  157.     MoveQ    #0,d0                        ;Everything ok
  158.     Rts
  159.  
  160. .beamDelay
  161.     Move.w    $06(a4),d1
  162.     Lsr.w    #8,d1
  163. .bmlp    Move.w    $06(a4),d2                    ;Word access
  164.     Lsr.w    #8,d2
  165.     Cmp.b    d2,d1
  166.     Beq.s    .bmlp
  167.     Dbf    d0,.beamDelay
  168.     Rts
  169.  
  170. getVBR    MoveQ    #0,d2
  171.     Move.l    4.w,a6
  172.     Btst    #0,$129(a6)                    ;>= 68010 ?
  173.     Beq.s    .no010
  174.     Lea    .getVBRException(PC),a5
  175.     Jmp    -$1e(a6)                    ;Supervisor()
  176. .no010    Rts
  177.  
  178.     CNOP    0,4
  179. .getVBRException
  180.     Dc.l    $4e7a2801                    ;MoveC VBR,d2
  181.     Rte
  182.  
  183.     IFNE    CACHEOFF
  184. DisableCache
  185.     Move.l    4.w,a6
  186.     MoveQ    #0,d0                        ;Get old cache state
  187.     MoveQ    #0,d1
  188.     Bsr.s    CacheControl
  189.     Lea    oldCache(PC),a0
  190.     Move.l    d0,(a0)
  191.     Move.l    d0,d1                        ;Disable cache
  192.     MoveQ    #0,d0
  193. CacheControl                            ;Based on KCS3.0
  194.     MoveQ    #0,d3
  195.     Move.w    $128(a6),d4
  196.     Btst    #1,d4
  197.     Beq.s    .no020
  198.     And.l    d1,d0
  199.     Or.w    #$808,d0
  200.     Not.l    d1
  201.     Lea    .cacheException(PC),a5
  202.     Jsr    -$1e(a6)                    ;Supervisor()
  203. .no020    Move.l    d3,d0
  204.     Rts
  205.  
  206.     CNOP    0,4
  207. .cacheException
  208.     Or.w    #$700,SR
  209.     Dc.l    $4e7a2002                    ;MoveC CACR,d2
  210.     Btst    #3,d4
  211.     Beq.s    .no040a
  212.     Swap    d2
  213.     Ror.w    #8,d2
  214.     Rol.l    #1,d2
  215. .no040a    Move.l    d2,d3
  216.     And.l    d1,d2
  217.     Or.l    d0,d2
  218.     Btst    #3,d4
  219.     Beq.s    .no040b
  220.     Ror.l    #1,d2
  221.     Rol.w    #8,d2
  222.     Swap    d2
  223.     And.l    #$80008000,d2
  224.     Nop
  225.     Dc.w    $f4f8                        ;CPushA BC
  226. .no040b    Nop
  227.     Dc.l    $4e7b2002                    ;MoveC d2,CACR
  228.     Nop
  229.     Rte
  230.  
  231. restoreCache
  232.     Move.l    4.w,a6
  233.     Move.l    oldCache(PC),d0
  234.     Move.l    d0,d1
  235.     Bra.s    CacheControl
  236.     ENDC
  237.  
  238. WaitBeam
  239.     Lsl.l    #8,d0
  240. .wlp:    Move.l    $04(a4),d1
  241.     And.l    #$1ff00,d1
  242.     Cmp.l    d0,d1
  243.     Bne.s    .wlp
  244.     Rts
  245.  
  246.  
  247.     ;----------------------------------------------------------------------------------------------
  248.  
  249.  
  250. FreeSystem
  251.     Lea    $dff000,a4
  252.     MoveQ    #$1f,d0
  253.     Bsr.s    WaitBeam
  254.     Move.l    #$7fff3fff,$9a(a4)                ;Kill INTENA and INTREQ
  255.     Move.w    #$7fff,$9e(a4)                    ;Kill ADKCON
  256.     Move.w    #$07ff,$96(a4)                    ;Kill DMACON
  257.  
  258.     Move.l    zeroPagePtr(PC),a0
  259.     Move.l    VBRReg(PC),a1
  260.     Move.w    #$400/4-1,d7
  261. .clp    Move.l    (a0)+,(a1)+
  262.     Dbf    d7,.clp
  263.  
  264.     Lea    oldDMACON(PC),a0
  265.     Move.w    (a0)+,$96(a4)                    ;Restore DMACON
  266.     Move.w    (a0)+,$9e(a4)                    ;Restore ADKCON
  267.     Move.l    (a0),$9a(a4)                    ;Restore INTENA and INTREQ
  268.  
  269.     IFNE    CACHEOFF
  270.     Bsr.s    RestoreCache
  271.     ENDC
  272.     Move.l    gfxBase(PC),a6
  273.     IFEQ    CHIPSETEXIT
  274.     Move.b    chipSetFlag(PC),d0
  275.     Beq.s    .noViewFix
  276.     ENDC
  277.     Move.l    oldView(PC),a1                    ;Old WorkBench view
  278.     MoveQ    #$7f,d0
  279.     Bsr.s    WaitBeam
  280.     Jsr    -$de(a6)                    ;LoadView()
  281. .noViewFix
  282.     Move.l    $26(a6),$80(a4)                    ;Restore system copper list
  283.     Move.l    $32(a6),$84(a4)
  284.     Move.w    d0,$88(a4)
  285.     Jsr    -$10e(a6)                    ;WaitTOF()
  286.     Jsr    -$10e(a6)                    ;Twice
  287.     Jsr    -$e4(a6)                    ;WaitBlit()
  288.     Jsr    -$1ce(a6)                    ;DisownBlitter()
  289.  
  290.     Move.l    a6,a1
  291.     Move.l    4.w,a6
  292.     Jsr    -$19e(a6)                    ;CloseLibrary()
  293.     Move.l    zeroPagePtr(pc),a1
  294.     Move.l    #$400,d0
  295.     Jsr    -$d2(a6)                    ;FreeMem()
  296.     Jmp    -$8a(a6)                    ;Permit()
  297.  
  298.  
  299. ;======================================================================================================
  300.  
  301.  
  302. oldDMACON    Ds.w    1
  303. oldADKCON    Ds.w    1
  304. oldINTENA    Ds.l    1
  305. zeroPagePtr    Ds.l    1
  306. VBRReg        Ds.l    1
  307. oldView        Ds.l    1
  308. gfxBase        Ds.l    1
  309.     IFNE    CACHEOFF
  310. oldCache    Ds.l    1
  311.     ENDC
  312. gfxLib:        Dc.b    'graphics.library',0
  313.     IFNE    CHIPSETEXIT-2
  314. chipSetFlag    Ds.b    1                    ;0 = OCS, 1 = ECS, 2 = AGA
  315.     ENDC
  316.     IFEQ    NTSCEXIT
  317. displayFlag    Ds.b    1                    ;0 = PAL, -1 = NTSC
  318.     ENDC
  319.     even